// Copyright 2021 Tencent Inc. All rights reserved.
//
// 商家转账对外API（2025年1月15日升级版本）
//
// 查询转账单
// [https://pay.weixin.qq.com/doc/v3/merchant/4012716437](https://pay.weixin.qq.com/doc/v3/merchant/4012716437)
// 商家转账用户确认模式下，查询转账单的详细信息。
//
// 注意
// API只支持查询最近30天内的转账单，超过30天可以通过资金账单对账确认。
// 转账单中涉及金额的字段单位为“分”。
// 如果遇到新的错误码，请务必不要换单重试，请联系客服确认转账情况。如果有新的错误码，会更新到此API文档中。
// 错误码描述字段message只供人工定位问题时做参考，系统实现时请不要依赖这个字段来做自动化处理。
// 接口限频： 单个商户 100 QPS，如果超过频率限制，会报错 FREQUENCY_LIMITED，请降低频率请求。
//
// API version: 1.0.0

// Code generated by WechatPay APIv3 Generator based on [OpenAPI
// Generator](https://openapi-generator.tech); DO NOT EDIT.

package com.wechat.pay.java.service.mchtransfer.model;

import com.google.gson.annotations.SerializedName;

import java.util.function.UnaryOperator;

import static com.wechat.pay.java.core.util.StringUtil.toIndentedString;

/** TransferBillEntity */
public class TransferBillEntity {
    /** 【商户号】 微信支付分配的商户号 */
    @SerializedName("mch_id")
    private String mchId;

    /** 【商户单号】 商户系统内部的商家单号，要求此参数只能由数字、大小写字母组成，在商户系统内部唯一 */
    @SerializedName("out_bill_no")
    private String outBillNo;

    /** 【商家转账订单号】 商家转账订单的主键，唯一定义此资源的标识 */
    @SerializedName("transfer_bill_no")
    private String transferBillNo;

    /**
     * 【商户AppID】 是微信开放平台和微信公众平台为开发者的应用程序(APP、小程序、公众号、企业号corpid即为此AppID)提供的一个唯一标识。
     * 此处，可以填写这四种类型中的任意一种APPID，但请确保该appid与商户号有绑定关系。 详见：<a
     * href="https://pay.weixin.qq.com/doc/v3/merchant/4013070756">普通商户模式开发必要参数说明</a>。
     */
    @SerializedName("appid")
    private String appid;

    /**
     * 【单据状态】 商家转账订单状态
     *
     * <ul>
     *   <li>ACCEPTED: 转账已受理
     *   <li>PROCESSING: 转账锁定资金中。如果一直停留在该状态，建议检查账户余额是否足够，如余额不足，可充值后再原单重试。
     *   <li>WAIT_USER_CONFIRM: 待收款用户确认，可拉起微信收款确认页面进行收款确认
     *   <li>TRANSFERING: 转账中，可拉起微信收款确认页面再次重试确认收款
     *   <li>SUCCESS: 转账成功
     *   <li>FAIL: 转账失败
     *   <li>CANCELING: 商户撤销请求受理成功，该笔转账正在撤销中
     *   <li>CANCELLED: 转账撤销完成
     * </ul>
     */
    @SerializedName("state")
    private String state;

    /** 【转账金额】 转账金额单位为“分”。 */
    @SerializedName("transfer_amount")
    private Long transferAmount;

    /** 【转账备注】 单条转账备注（微信用户会收到该备注），UTF8编码，最多允许32个字符 */
    @SerializedName("transfer_remark")
    private String transferRemark;

    /**
     * 【失败原因】 订单已失败或者已退资金时，会返回<a
     * href="https://pay.weixin.qq.com/doc/v3/merchant/4013774966">订单失败原因</a>
     */
    @SerializedName("fail_reason")
    private String failReason;

    /**
     * 【收款用户OpenID】 用户在商户appid下的唯一标识。发起转账前需获取到用户的OpenID，获取方式详见 <a
     * href="https://pay.weixin.qq.com/doc/v3/merchant/4012068676">参数说明</a>。
     */
    @SerializedName("openid")
    private String openid;

    /**
     * 【收款用户姓名】 收款方真实姓名。需要加密传入，支持标准RSA算法和国密算法，公钥由微信侧提供。<br>
     * 转账金额 >= 2,000元时，该笔明细必须填写<br>
     * 若商户传入收款用户姓名，微信支付会校验收款用户与输入姓名是否一致，并提供电子回单
     */
    @SerializedName("user_name")
    private String userName;

    /** 【单据创建时间】 单据受理成功时返回，按照使用rfc3339所定义的格式，格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */
    @SerializedName("create_time")
    private String createTime;

    /** 【最后一次状态变更时间】 单据最后更新时间，按照使用rfc3339所定义的格式，格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */
    @SerializedName("update_time")
    private String updateTime;

    public String getMchId() {
        return mchId;
    }

    public void setMchId(String mchId) {
        this.mchId = mchId;
    }

    public String getOutBillNo() {
        return outBillNo;
    }

    public void setOutBillNo(String outBillNo) {
        this.outBillNo = outBillNo;
    }

    public String getTransferBillNo() {
        return transferBillNo;
    }

    public void setTransferBillNo(String transferBillNo) {
        this.transferBillNo = transferBillNo;
    }

    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public Long getTransferAmount() {
        return transferAmount;
    }

    public void setTransferAmount(Long transferAmount) {
        this.transferAmount = transferAmount;
    }

    public String getTransferRemark() {
        return transferRemark;
    }

    public void setTransferRemark(String transferRemark) {
        this.transferRemark = transferRemark;
    }

    public String getFailReason() {
        return failReason;
    }

    public void setFailReason(String failReason) {
        this.failReason = failReason;
    }

    public String getOpenid() {
        return openid;
    }

    public void setOpenid(String openid) {
        this.openid = openid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    public String getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(String updateTime) {
        this.updateTime = updateTime;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("class TransferBillEntity {\n");
        sb.append("    mchId: ").append(toIndentedString(mchId)).append("\n");
        sb.append("    outBillNo: ").append(toIndentedString(outBillNo)).append("\n");
        sb.append("    transferBillNo: ").append(toIndentedString(transferBillNo)).append("\n");
        sb.append("    appid: ").append(toIndentedString(appid)).append("\n");
        sb.append("    state: ").append(toIndentedString(state)).append("\n");
        sb.append("    transferAmount: ").append(toIndentedString(transferAmount)).append("\n");
        sb.append("    transferRemark: ").append(toIndentedString(transferRemark)).append("\n");
        sb.append("    failReason: ").append(toIndentedString(failReason)).append("\n");
        sb.append("    openid: ").append(toIndentedString(openid)).append("\n");
        sb.append("    userName: ").append(toIndentedString(userName)).append("\n");
        sb.append("    createTime: ").append(toIndentedString(createTime)).append("\n");
        sb.append("    updateTime: ").append(toIndentedString(updateTime)).append("\n");
        sb.append("}");
        return sb.toString();
    }

    public TransferBillEntity cloneWithCipher(UnaryOperator<String> s) {
        TransferBillEntity copy = new TransferBillEntity();
        copy.mchId = mchId;
        copy.outBillNo = outBillNo;
        copy.transferBillNo = transferBillNo;
        copy.appid = appid;
        copy.state = state;
        copy.transferAmount = transferAmount;
        copy.transferRemark = transferRemark;
        copy.failReason = failReason;
        copy.openid = openid;
        if (userName != null && !userName.isEmpty()) {
            copy.userName = s.apply(userName);
        }
        copy.createTime = createTime;
        copy.updateTime = updateTime;
        return copy;
    }
}